import {
	ref,
	computed,
	onMounted,
	watch
} from 'vue';
import china from "./china.js";
import english from "./english.js";

// 中文、英文、越南文、西班牙文、日文、法文
const LanguageArr = [{
		value: "CN",
		label: "中 文"
	},
	{
		value: "EN",
		label: "English"
	},
	// { value: "VN", label: "Việt nam" },
	// { value: "ES", label: "Español" },
	// { value: "JP", label: "日本語" },
	// { value: "FR", label: "En français" },
];

// 语言包映射（可扩展更多语言）
const LanguageMap = {
	"CN": {
		LanguageObj: china
	},
	"EN": {
		LanguageObj: english
	}
};

// 默认语言（优先级：缓存 > 系统语言 > 中文）
const defaultLanguage = "CN";

// 响应式语言标识（用于模板和逻辑中）
export const Language = ref(defaultLanguage);

// 响应式当前语言包
export const LanguagePackage = computed(() => {
	return LanguageMap[Language.value] || LanguageMap[defaultLanguage];
});

// 初始化：读取缓存 + 检测系统语言
const initLanguage = () => {
	// 1. 读取本地缓存（UniApp 多端兼容存储）
	const cacheLang = uni.getStorageSync("Language");
	if (cacheLang && LanguageMap[cacheLang]) {
		Language.value = cacheLang;
		return;
	}

	// 2. 检测系统语言（小程序/App 兼容）
	uni.getSystemInfo({
		success: (res) => {
			let systemLang = res.language || res.systemLanguage;
			// 简化语言标识（如 en-US、zh-CN，适配不同系统返回格式）
			if (systemLang.includes("zh")) systemLang = "CN";
			else if (systemLang.includes("en")) systemLang = "EN";
			else systemLang = defaultLanguage;

			Language.value = systemLang;
			// 缓存语言偏好
			uni.setStorageSync("Language", systemLang);
		},
		fail: () => {
			Language.value = defaultLanguage;
			uni.setStorageSync("Language", defaultLanguage);
		}
	});
};

// 翻译核心函数：支持对象嵌套（a.b.c）、数组索引（fruits[0]）、参数替换
export const t = (key, params = {}) => {
	if (!key) return "";

	// 解析 key：支持 a.b.c 或 fruits[0] 格式
	const keys = key.split(/\.|\[|\]/).filter(k => k); // 分割并过滤空值
	let value = LanguagePackage.value;

	// 递归查找语言包值
	for (const k of keys) {
		if (value === undefined || value === null) break;
		value = value[k];
	}

	// 未找到对应 key 时返回原 key
	if (value === undefined || value === null) return key;

	// 替换参数（如 {name}、{count}）
	return typeof value === "string" ?
		value.replace(/\{(\w+)\}/g, (_, match) => params[match] || `{${match}}`) :
		value; // 非字符串（如数组）直接返回
};

// 切换语言（响应式更新 + 缓存）
export const changeLang = (lang) => {
	if (!LanguageMap[lang]) return; // 无效语言不切换
	Language.value = lang;
	uni.setStorageSync("Language", lang);
};

// 组合式 API：在组件中使用（可选，也可直接导入 t 和 Language）
export const useI18n = () => {
	onMounted(() => {
		initLanguage(); // 组件挂载时初始化（确保只执行一次）
	});

	// 监听语言变化，可扩展回调（如刷新某些配置）
	watch(Language, (newLang) => {
		console.log("语言切换为：", newLang);
		// 可选：触发全局事件，通知其他组件
		uni.$emit("LanguageChange", newLang);
	});

	return {
		t,
		Language,
		changeLang
	};
};

// 全局挂载（用于模板直接使用 $t）
export const install = (app) => {
	// 挂载全局函数
	app.config.globalProperties.$t = t;
	// 挂载全局响应式变量（模板中可直接访问 $Language）
	app.config.globalProperties.$Language = Language;
	app.config.globalProperties.$changeLang = changeLang;
};

// // 国际化
// import {
// 	t,
// 	Language
// } from "@/i18n/index.js";

// // js中使用
// const name = "LanguageObj.common.title";
// // 模板中
// $t(name)

// 模板中使用
// $t("LanguageObj.common.title")